package com.zut.controller;

import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zut.mapper.LinkMapper;
import com.zut.pojo.Link;
import com.zut.pojo.Manager;
import com.zut.pojo.UploadLink;
import com.zut.service.LinkService;
import com.zut.utils.LinkDataListener;
import com.zut.utils.UserUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

/**
 * @author: Mr.Liu
 * @create: 2021-11-26 18:08
 */
@Controller
public class XlsxController {


    @Autowired
    LinkMapper linkMapper;

    @Autowired
    UserUtil userUtil;

    @Autowired
    LinkService linkService;

    @ApiOperation("模板文件下载")
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("/link/template/xlsx")
    public String templateDownload(HttpServletResponse response, HttpServletRequest request) throws IOException {
        File file = new File("./upload/批量导入模板.xlsx");
        if (file.exists()) {
            response.setContentType("application/force-download");// 设置强制下载不打开
            response.addHeader("Content-Disposition", "attachment;fileName=" + "批量导入模板.xlsx");// 设置文件名
            byte[] buffer = new byte[1024];
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            try {
                fis = new FileInputStream(file);
                bis = new BufferedInputStream(fis);
                OutputStream os = response.getOutputStream();
                int i = bis.read(buffer);
                while (i != -1) {
                    os.write(buffer, 0, i);
                    i = bis.read(buffer);
                }
                return "下载成功";
            } catch (Exception e) {
                e.printStackTrace();
            } finally { // 做关闭操作
                if (bis != null) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return "下载失败";

    }


    @ApiOperation("管理员导出表格")
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("/link/admin/xlsx")
    public void adminDownload(HttpServletResponse response, HttpServletRequest request) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("链接数据", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Link.class).sheet("链接管理").doWrite(linkMapper.selectList(new QueryWrapper<Link>()));//linkMapper.selectList(new QueryWrapper<Link>())
    }


    @ApiOperation("用户导出表格")
    /**
     * 文件下载（失败了会返回一个有部分数据的Excel）
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DownloadData}
     * <p>
     * 2. 设置返回的 参数
     * <p>
     * 3. 直接写，这里注意，finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
     */
    @GetMapping("/link/user/xlsx")
    public void userDownload(HttpServletResponse response, HttpServletRequest request, Integer id) throws IOException {
        if (id == null || "".equals(id)) {
            return;
        }
        Manager manager = userUtil.getManager(request);//获取当前登录用户的ID
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(manager.getUsername()+"链接文件", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Link.class).sheet("链接管理").doWrite(linkMapper.selectList(new QueryWrapper<Link>().eq("uuid", manager.getId())));
    }

    @ApiOperation("批量导入链接")
    /**
     * 文件上传
     * <p>
     * 1. 创建excel对应的实体对象
     * <p>
     * 2. 由于默认一行行的读取excel，所以需要创建excel一行一行的回调监听器，
     * <p>
     * 3. 直接读即可
     */
    @PostMapping("/more/upload")
    @ResponseBody
    public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {
        if (file == null) {
            System.out.println("kong!!!!!");
        }

        System.out.println("开始");
        EasyExcel.read(file.getInputStream(), UploadLink.class, new LinkDataListener(linkService, request)).sheet().doRead();
        System.out.println("结束");
        return "success";
    }


}
